﻿#ifndef WRWORKTCPCOMMSERVERSESSION_H
#define WRWORKTCPCOMMSERVERSESSION_H

#include "../WRGlobal.h"
#include "../../WRSoft-Utility/Structs/WRArray.h"
#include "../../WRSoft-Utility/Runtime/WRType.h"
#include "../../WRSoft-Utility/Runtime/WRDataPacket.h"

#include <QList>
#include <QMutex>
#include <QAtomicInt>

//声明工作TCP通讯服务器对象。
class WRWorkTcpCommServerObject;
//声明工作TCP通讯服务器套接字
class WRWorkTcpCommServerSocket;

//表示工作TCP通讯服务器会话。
class WRSOFT_WORKING_COMMON_CLASS WRWorkTcpCommServerSession
{
private:
    //引用计数。
    QAtomicInt m_refCnt;
    //同步对象。
    QMutex m_mutex;
    //通讯实例。
    WRWorkTcpCommServerSocket* m_socket;
    //对象集合。
    WRArray<WRWorkTcpCommServerObject*> m_objects;

    //释放当前对象所占用的相关资源。
    ~WRWorkTcpCommServerSession();

    //发送打开结果第一包数据。
    void sendOpenResult(WR64s ticks, const QList<WRType*>& types);
    //发送打开结果第二包数据。
    void sendOpenResult(WR64s ticks, const WRArray<WRWorkTcpCommServerObject*>& objects);

public:
    //初始化TCP服务会话。
    explicit WRWorkTcpCommServerSession(WRWorkTcpCommServerSocket* socket);

    //添加对象引用。
    inline void addRef(void)
    {
        m_refCnt.ref();
    }
    //释放对象引用, 如果引用计数为0，则删除对象，返回True，否则返回False。
    inline bool release(void)
    {
        if (!m_refCnt.deref())
        {
            delete this;
            return true;
        }
        return false;
    }

    //关闭会话。
    void shutdown(void);

    //获取会话是否有效。
    inline bool effective(void) const
    {
        return m_socket != 0;
    }

    //执行接收到的数据帧处理。
    void procData(const char* buf, int len);
    //执行数据发送操作。
    bool sendData(WRDataPacket* packet);
};

#endif // WRWORKTCPCOMMSERVERSESSION_H
